﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Negocio.Eventos;
using Entidades.Eventos;

public partial class Eventos_frmRegistrarReserva : System.Web.UI.Page
{

  
    protected void Page_Load(object sender, EventArgs e)
    {
        buscarCliente.ServerClick += new EventHandler(buscarCliente_ServerClick);
        cancelar.ServerClick += new EventHandler(cancelar_ServerClick);
        calcular.ServerClick += new EventHandler(calcular_ServerClick);
        guardar.ServerClick += new EventHandler(guardar_ServerClick);
        enlaceVerCatalogo.ServerClick += new EventHandler(enlaceVerCatalogo_ServerClick);

        verContrato.ServerClick += new EventHandler(verContrato_ServerClick);

        if(!Page.IsPostBack)
        {
            asistentes.Items.Clear();
            for (int i = 2; i<= 30;i++ )
            {
                asistentes.Items.Add(i.ToString());
            }

            List<GenLocal> genLocalList = GenLocalBLL.listar();
            List<ListItem> listListItem = genLocalList.Select(lo => new ListItem { Value = lo.iDLocal.ToString(), Text = lo.nombre }).ToList();

            selectLocal.Items.Clear();
            foreach (ListItem listItem in listListItem)
                selectLocal.Items.Add(listItem);


            txtFechaRealizacion.Value = Session["fechaRealizacion"] == null ? "" : Session["fechaRealizacion"].ToString();
            horaevento.Value = Session["horaRealizacion"] == null ? "" : Session["horaRealizacion"].ToString();
            asistentes.Value = Session["asistentes"] == null ? "" : Session["asistentes"].ToString();
            selectLocal.Value = Session["local"] == null ? "" : Session["local"].ToString();
        }

        var clienteSeleccionado = Session["clienteSeleccionado"];

        if (clienteSeleccionado != null)
        {
            GenCliente clienteObj = (GenCliente)clienteSeleccionado;
            fillClientInformation(clienteObj);
        }

        var eventoTest = Session["eventoSeleccionado"];

        if (eventoTest != null)
        {
            EveEvento eventoObj = (EveEvento)eventoTest;
            fillEventoAndProductsInformation(eventoObj);
        }

    }

    void enlaceVerCatalogo_ServerClick(object sender, EventArgs e)
    {
        Session["fechaRealizacion"] = txtFechaRealizacion.Value;
        Session["horaRealizacion"] = horaevento.Value;
        Session["asistentes"] = asistentes.Value;
        Session["local"] = selectLocal.Value;
        Response.Redirect("frmCatalogoEvento.aspx");
    }

    void verContrato_ServerClick(object sender, EventArgs e)
    {
        if (estado.Value == "1")
        {
            ClientScript.RegisterStartupScript(this.GetType(), "newWindow", String.Format("<script>window.open('{0}');</script>", "frmGenerarContrato.aspx"));    
        }
        else
        {
            EveReserva newReserva = new EveReserva();

            newReserva.cantidadPersonas = Convert.ToInt32(asistentes.Value);
            newReserva.estado = Convert.ToInt32(estado.Value);
            newReserva.fechaRealizacion = Convert.ToDateTime(txtFechaRealizacion.Value);
            newReserva.fechaReserva = DateTime.Now;
            newReserva.horarealizacion = horaevento.Value;
            GenCliente clienteSelect = (GenCliente)Session["clienteSeleccionado"];
            newReserva.idCliente = clienteSelect.idCliente;
            EveEvento eventoSelect = (EveEvento)Session["eventoSeleccionado"];
            newReserva.idEvento = eventoSelect.idEvento;
            newReserva.observacion = observaciones.InnerText.ToString();
            newReserva.totalMonto = Convert.ToDecimal(total.Value);

            Session["nuevaReserva"] = newReserva;

            List<EveDetalleReserva> listaDetalles = new List<EveDetalleReserva>();
            EveEvento eventoSeleccionado = (EveEvento)Session["eventoSeleccionado"];
            foreach (EveProductoEvento item in eventoSeleccionado.Eve_Producto_evento)
            {

                //buscamos las cantidades y los subtotales
                int cantidad = 0;
                decimal subtotal = 0M;
                foreach (TableRow tr in tablaProductos.Controls)
                {
                    foreach (TableCell tc in tr.Controls)
                    {
                        if (tc.ID != null)
                        {
                            string idProduct = tc.ID.Substring(10);
                            if (item.idProducto == Convert.ToInt32(idProduct))
                            {
                                if (tc.ID != null && tc.ID.Contains("cantidadtc"))
                                {
                                    ControlCollection controles = tc.Controls;
                                    if (controles.Count > 0)
                                    {
                                        if (tc.Controls[0] is TextBox)
                                        {
                                            TextBox textBox = (TextBox)tc.Controls[0];
                                            cantidad = Convert.ToInt32(textBox.Text);
                                        }
                                    }
                                }
                                else if (tc.ID != null && tc.ID.Contains("subtotaltc"))
                                {
                                    ControlCollection controles = tc.Controls;
                                    if (controles.Count > 0)
                                    {
                                        if (tc.Controls[0] is Label)
                                        {
                                            Label label = (Label)tc.Controls[0];
                                            subtotal = Convert.ToDecimal(label.Text);
                                        }
                                    }
                                }
                            } 
                        }
                        
                    }
                }

                EveDetalleReserva detalleReserva = new EveDetalleReserva();
                detalleReserva.cantidadProducto = cantidad;
                detalleReserva.idProducto = item.idProducto;
                detalleReserva.subtotal = subtotal;
                listaDetalles.Add(detalleReserva);
            }

            Session["detallesReservaSeleccionados"] = listaDetalles;
            ClientScript.RegisterStartupScript(this.GetType(), "newWindow", String.Format("<script>window.open('{0}');</script>", "frmGenerarProforma.aspx"));
        }
    }

    void cancelar_ServerClick(object sender, EventArgs e)
    {
        Session.RemoveAll();
        Response.Redirect("frmGestionarReserva.aspx");
    }


    void guardar_ServerClick(object sender, EventArgs e)
    {
        if (validar())
        {
            EveReserva newReserva = new EveReserva();

            newReserva.cantidadPersonas = Convert.ToInt32(asistentes.Value);
            newReserva.estado = Convert.ToInt32(estado.Value);
            newReserva.fechaRealizacion = Convert.ToDateTime(txtFechaRealizacion.Value);
            newReserva.fechaReserva = DateTime.Now;
            newReserva.horarealizacion = horaevento.Value;
            GenCliente clienteSelect = (GenCliente)Session["clienteSeleccionado"];
            newReserva.idCliente = clienteSelect.idCliente;
            EveEvento eventoSelect = (EveEvento)Session["eventoSeleccionado"];
            newReserva.idEvento = eventoSelect.idEvento;
            newReserva.observacion = observaciones.InnerText.ToString();
            newReserva.totalMonto = Convert.ToDecimal(total.Value);
            newReserva.IDLocal = Convert.ToInt32(selectLocal.Value);

            List<EveDetalleReserva> listaDetalles = new List<EveDetalleReserva>();

            EveEvento eventoSeleccionado = (EveEvento)Session["eventoSeleccionado"];

            foreach (EveProductoEvento item in eventoSeleccionado.Eve_Producto_evento)
            {

                //buscamos las cantidades y los subtotales
                int cantidad = 0;
                decimal subtotal = 0M;
                foreach (TableRow tr in tablaProductos.Controls)
                {
                    foreach (TableCell tc in tr.Controls)
                    {
                        if (tc.ID == "cantidadtc" + item.idProducto)
                        {
                            ControlCollection controles = tc.Controls;
                            if (controles.Count > 0)
                            {
                                if (tc.Controls[0] is TextBox)
                                {
                                    TextBox textBox = (TextBox)tc.Controls[0];
                                    cantidad = Convert.ToInt32(textBox.Text);
                                }
                            }
                        }
                        else if (tc.ID == "subtotaltc" + item.idProducto)
                        {
                            ControlCollection controles = tc.Controls;
                            if (controles.Count > 0)
                            {
                                if (tc.Controls[0] is Label)
                                {
                                    Label label = (Label)tc.Controls[0];
                                    subtotal = Convert.ToDecimal(label.Text);
                                }
                            }

                            goto AgregarDetalle;
                        }

                    }
                }

                AgregarDetalle:
                EveDetalleReserva detalleReserva = new EveDetalleReserva();
                detalleReserva.cantidadProducto = cantidad;
                detalleReserva.idProducto = item.idProducto;
                detalleReserva.subtotal = subtotal;
                listaDetalles.Add(detalleReserva);
            }


            newReserva.Eve_Detalle_reserva = listaDetalles;

            EveContratoEvento eveContratoEvento = new EveContratoEvento();
            eveContratoEvento.estado = Convert.ToInt32(estado.Value);
            eveContratoEvento.fechaContrato = DateTime.Now;

            List<EveContratoEvento> eveContratoEventoList = new List<EveContratoEvento>();
            eveContratoEventoList.Add(eveContratoEvento);
            newReserva.Eve_Contrato_evento = eveContratoEventoList;
            EveReservaBLL.guardar(newReserva);

            Session.RemoveAll();
            Response.Redirect("frmGestionarReserva.aspx");   
        }
    }

    void calcular_ServerClick(object sender, EventArgs e)
    {
        double montoTotal = 0;
        foreach (TableRow tr in tablaProductos.Controls)
        {
            foreach (TableCell tc in tr.Controls)
            {

                if (tc.ID != null && tc.ID.Contains("subtotaltc"))
                {
                    ControlCollection controles = tc.Controls;
                    if (controles.Count > 0)
                    {
                        if (tc.Controls[0] is Label)
                        {
                            Label label = (Label)tc.Controls[0];
                            montoTotal = montoTotal + Convert.ToDouble(label.Text);
                        }
                    }
                }
            }
        }
        total.Value = montoTotal.ToString("0.00");
    }

    void buscarCliente_ServerClick(object sender, EventArgs e)
    {

        String nroDoc = numerodocumento.Value;
        String tipoDoc = tipodocumento.Value;
        if (tipoDoc != "-1" && nroDoc != String.Empty)
        {
            GenCliente eveCliente = GenClienteBLL.buscar(tipoDoc, nroDoc);
            if (eveCliente != null)
            {
                fillClientInformation(eveCliente);
            }
        }
    }

    void fillClientInformation(GenCliente nuevoCliente)
    {
        Session["clienteSeleccionado"] = nuevoCliente;

        nombres.Value = nuevoCliente.nombre;
        telefono.Value = nuevoCliente.telefono;
        fechanacimiento.Value = nuevoCliente.fechaNacimiento.Value.ToString("dd/MM/yyyy");
        email.Value = nuevoCliente.email;
        direccion.Value = nuevoCliente.direccion;
        numerodocumento.Value = nuevoCliente.NroDocumento;

    }

    void fillEventoAndProductsInformation(EveEvento eventoSelected)
    {
        bool inicio = !Page.IsPostBack;
        nombreevento.Value = eventoSelected.nombre;
        codigoevento.Value = eventoSelected.idEvento.ToString();
        tipoevento.Value = eventoSelected.Eve_Tipo_evento.nombre;

        List<EveDetalleReserva> listaDetalles = new List<EveDetalleReserva>();
        //fill products table
        foreach (EveProductoEvento itemTMP in eventoSelected.Eve_Producto_evento)
        {
            decimal? montoConDescuento = itemTMP.Eve_Producto.monto - itemTMP.descuento;

            TableRow tr1 = new TableRow();

            TableCell tc1 = new TableCell(); //Producto
            Label lbl1 = new Label();
            lbl1.Text = itemTMP.Eve_Producto.nombre;
            tc1.Controls.Add(lbl1);

            TableCell tc2 = new TableCell(); //Cantidad
            tc2.ID = "cantidadtc" + itemTMP.idProducto;
            TextBox txtCantidad = new TextBox();
            if (inicio)
                txtCantidad.Text = "1";
            else
                txtCantidad.Text = Request.Form["cantidad" + itemTMP.idProducto];

            txtCantidad.TextChanged += new EventHandler(txtCantidad_TextChanged);
            txtCantidad.Attributes.Add("runat", "server");
            txtCantidad.Attributes.Add("onchange", "__doPostBack('txtCantidad_TextChanged','')" );
            txtCantidad.ID = "cantidad" + itemTMP.idProducto;

            tc2.Controls.Add(txtCantidad);

            TableCell tc3 = new TableCell(); //Precio Unitario
            Label lbl3 = new Label();
            lbl3.Text = montoConDescuento.Value.ToString("0.00");
            tc3.Controls.Add(lbl3);

            TableCell tc4 = new TableCell(); //Subtotal
            tc4.ID = "subtotaltc" + itemTMP.idProducto;
            Label lbl4 = new Label();
            lbl4.Attributes.Add("runat", "server");
            lbl4.ID = "subtotal" + itemTMP.idProducto;
            decimal subtotal = montoConDescuento.Value * Convert.ToInt32(txtCantidad.Text);
            lbl4.Text = subtotal.ToString("0.00"); 
            tc4.Controls.Add(lbl4);

            tr1.Cells.Add(tc1);
            tr1.Cells.Add(tc2);
            tr1.Cells.Add(tc3);
            tr1.Cells.Add(tc4);

            tablaProductos.Rows.Add(tr1);
        }
    }

    protected void txtCantidad_TextChanged(object sender, EventArgs e)
    {
        TextBox textBox = (TextBox)sender;

        if (textBox.Text.Trim() != String.Empty)
        {
            int idProducto = Convert.ToInt32(textBox.ID.Replace("cantidad", ""));

            var eventoTest = Session["eventoSeleccionado"];
            EveProductoEvento eveProductoEvento = null;
            if (eventoTest != null)
            {
                EveEvento eventoObj = (EveEvento)eventoTest;
                eveProductoEvento = eventoObj.Eve_Producto_evento.Where(pe => pe.Eve_Producto.idProducto == idProducto).FirstOrDefault();
            }

            foreach (TableRow tr in tablaProductos.Controls)
            {
                foreach (TableCell tc in tr.Controls)
                {

                    if (tc.ID != null && tc.ID.Contains("subtotaltc" + idProducto))
                    {
                        ControlCollection controles = tc.Controls;
                        if (controles.Count > 0)
                        {
                            if (tc.Controls[0] is Label)
                            {
                                Label label = (Label)tc.Controls[0];
                                label.Text = ((eveProductoEvento.Eve_Producto.monto - eveProductoEvento.descuento) * Convert.ToInt32(textBox.Text)).ToString();
                            }
                        }
                    }
                }
            }
        }
        else
        {
            textBox.Text = "1";
            Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('Debe ingresar una cantidad valida de productos.');", true); 
        }
    }

    bool validar()
    {
        DateTime fechaRealizacion = Convert.ToDateTime(txtFechaRealizacion.Value);

        if (fechaRealizacion < DateTime.Now)
        {
            Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('La fecha de realización de evento es menor a la actual.');", true);
            return false;
        }

        TimeSpan subtstractDate = fechaRealizacion.Subtract(DateTime.Now);
        if (subtstractDate.Days >= 3)
        {
            Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('El registro de la reserva de eventos debe realizarse con 3 días de anticipación.');", true);
            return false;
        }

        if (Session["clienteSeleccionado"] == null)
        {
            Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('Debe ingresar información del cliente.');", true);
            return false;
        }

        DateTime fechaRealizacionTMP = Convert.ToDateTime(txtFechaRealizacion.Value);
        if (fechaRealizacionTMP.DayOfWeek == DayOfWeek.Friday || fechaRealizacionTMP.DayOfWeek == DayOfWeek.Saturday || fechaRealizacionTMP.DayOfWeek == DayOfWeek.Sunday)
        {
            if (Convert.ToDouble(total.Value) < 180)
            {
                Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('De Viernes a Domingo el consumo mínimo es S/.180.00');", true);
                return false;
            }    
        }
        else
        {
            if (Convert.ToDouble(total.Value) < 60)
            {
                Page.ClientScript.RegisterStartupScript(GetType(), "msgbox", "alert('De Lunes a Jueves el consumo mínimo es S/.60.00.');", true);
                return false;
            }  
        }

        return true;
    }
   
}